package model;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Comparator;

public class Candidato implements Comparator<Candidato> {

  private int id;
  private String nome;
  private String partido;
  private int numeroCandidato;
  private Cargo cargo;  
  private String nomeVicePriSuplente;
  private String nomeSegSuplente;
  private String endFotoCandidato;  
  private String endFotoVicePriSuplente;
  private String endFotoSegSuplente;
  private int qtdeVotos;  

  public static final String NOME_ARQUIVO = "C:/Urna/candidatos.txt";
  public static final String NOME_ARQUIVO_TEMP = "C:/Urna/candidatostem.txt";

  public Candidato() {

  }

  public Candidato(String nome, 
                   String partido, 
                   int    numeroCandidato, 
                   Cargo cargo, 
                   String nomeVicePriSuplente, 
                   String nomeSegSuplente, 
                   String endFotoCandidato, 
                   String endFotoVicePriSuplente, 
                   String endFotoSegSuplente) {
    
    this.nome = nome;
    this.partido = partido;
    this.numeroCandidato = numeroCandidato;
    this.cargo = cargo;    
    this.nomeVicePriSuplente = nomeVicePriSuplente;
    this.nomeSegSuplente = nomeSegSuplente;
    this.endFotoCandidato = endFotoCandidato;    
    this.endFotoVicePriSuplente = endFotoVicePriSuplente;
    this.endFotoSegSuplente = endFotoSegSuplente;
  }

  public Candidato(int    id, 
                   String nome, 
                   String partido, 
                   int    numeroCandidato, 
                   Cargo cargo,                    
                   String nomeVicePriSuplente, 
                   String nomeSegSuplente, 
                   String endFotoCandidato,                    
                   String endFotoVicePriSuplente, 
                   String endFotoSegSuplente) {
    this.id = id;
    this.nome = nome;
    this.partido = partido;
    this.numeroCandidato = numeroCandidato;
    this.cargo = cargo;    
    this.nomeVicePriSuplente = nomeVicePriSuplente;
    this.nomeSegSuplente = nomeSegSuplente;
    this.endFotoCandidato = endFotoCandidato;    
    this.endFotoVicePriSuplente = endFotoVicePriSuplente;
    this.endFotoSegSuplente = endFotoSegSuplente;
  }

  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
  }

  public String getNome() {
    return nome.toUpperCase();
  }

  public void setNome(String nome) {
    this.nome = nome.toUpperCase().replace(";", "");
  }

  public String getPartido() {
    return partido.toUpperCase();
  }

  public void setPartido(String partido) {
    this.partido = partido.toUpperCase().replace(";", "");;
  }

  public int getNumeroCandidato() {
    return numeroCandidato;
  }

  public void setNumeroCandidato(int numeroCandidato) {
    this.numeroCandidato = numeroCandidato;
  }

  public Cargo getCargo() {
    return cargo;
  }

  public void setCargo(Cargo cargo) {
    this.cargo = cargo;
  }
  
  public String getNomeVicePriSuplente() {
    return nomeVicePriSuplente;
  }

  public void setNomeVicePriSuplente(String nomeVicePriSuplente) {
    this.nomeVicePriSuplente = nomeVicePriSuplente.replace(";", "");
  }

  public String getNomeSegSuplente() {
    return nomeSegSuplente;
  }

  public void setNomeSegSuplente(String nomeSegSuplente) {
    this.nomeSegSuplente = nomeSegSuplente.replace(";", "");
  }

  public String getEndFotoCandidato() {
    return endFotoCandidato;
  }

  public void setEndFotoCandidato(String endFotoCandidato) {
    this.endFotoCandidato = endFotoCandidato;
  }

  public String getEndFotoVicePriSuplente() {
    return endFotoVicePriSuplente;
  }

  public void setEndFotoVicePriSuplente(String endFotoVicePriSuplente) {
    this.endFotoVicePriSuplente = endFotoVicePriSuplente;
  }

  public String getEndFotoSegSuplente() {
    return endFotoSegSuplente;
  }

  public void setEndFotoSegSuplente(String endFotoSegSuplente) {
    this.endFotoSegSuplente = endFotoSegSuplente;
  }

  public int getQtdeVotos() {
    return qtdeVotos;
  }

  public void setQtdeVotos(int qtdeVotos) {
    this.qtdeVotos = qtdeVotos;
  }
  public static void inserir(Candidato candidato) {

    try (PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter(new File(NOME_ARQUIVO), true)))) {

      if(candidato.getCargo().isPossuiVice() || candidato.getCargo().isPossuiSuplentes()) {
        if(candidato.getCargo().isPossuiVice()) {
          setEspaceSegSuplente(candidato);
        }
      } else {
        setEspaceViceSuplente(candidato);
      }
      
      writer.write(getProxId() + ";"
              + candidato.getNome() + ";"
              + candidato.getPartido() + ";"
              + candidato.getNumeroCandidato() + ";"
              + candidato.getCargo().getNome() + ";"
              + candidato.getEndFotoCandidato() + ";"
              + candidato.getNomeVicePriSuplente() + ";"
              + candidato.getEndFotoVicePriSuplente() + ";"
              + candidato.getNomeSegSuplente() + ";"
              + candidato.getEndFotoSegSuplente() + "\r\n");

      writer.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  public static int getProxId() {

    String linha;
    int maxIdCandidato = 0;

    try {

      BufferedReader reader = new BufferedReader(new FileReader(NOME_ARQUIVO));

      while ((linha = reader.readLine()) != null) {

        String[] t = linha.split(";");
        maxIdCandidato = Integer.parseInt(t[0]);
      }
      reader.close();

    } catch (IOException e) {
      e.printStackTrace();
    }

    return maxIdCandidato + 1;
  }

  public static void deletar(String candidatoNome) {

    String linha;
    Candidato candidato = Candidato.consultar(candidatoNome);

    try {

      BufferedWriter writer = new BufferedWriter(new FileWriter(NOME_ARQUIVO_TEMP));
      BufferedReader reader = new BufferedReader(new FileReader(NOME_ARQUIVO));

      while ((linha = reader.readLine()) != null) {

        String[] t = linha.split(";");

        if (!(candidato.getId() == Integer.parseInt(t[0]))) {
          writer.write(linha + "\r\n");
        }
      }
      writer.close();
      reader.close();

    } catch (IOException e) {
      e.printStackTrace();
    }

    while (new File(NOME_ARQUIVO).exists()) {
      new File(NOME_ARQUIVO).delete();
    }
    new File(NOME_ARQUIVO_TEMP).renameTo(new File(NOME_ARQUIVO));
  }

  public static Candidato consultar(String nome) {

    String linha;
    nome = nome.toUpperCase();
    
    try {
      
      Candidato cand = new Candidato();
      
      BufferedReader reader = new BufferedReader(new FileReader(NOME_ARQUIVO));

      while ((linha = reader.readLine()) != null) {

        String[] t = linha.split(";");
        if (nome.equals(t[1])) {                
                cand.setId(Integer.parseInt(t[0]));
                cand.setNome(t[1]);
                cand.setPartido(t[2]);
                cand.setNumeroCandidato(Integer.parseInt(t[3]));
                cand.setCargo(Cargo.consultar(t[4]));
                cand.setEndFotoCandidato(t[5]);
                cand.setNomeVicePriSuplente(t[6]);
                cand.setEndFotoVicePriSuplente(t[7]);
                cand.setNomeSegSuplente(t[8]);
                cand.setEndFotoSegSuplente(t[9]);
                return cand;
        }
      }
      reader.close();

    } catch (IOException e) {
      e.printStackTrace();
    }
    return null;
  }

  public static Candidato getCandidato(String numero, Cargo cargo) {

    Candidato c = new Candidato();

    String linha;
    try {
      BufferedReader reader = new BufferedReader(new FileReader(NOME_ARQUIVO));

      while ((linha = reader.readLine()) != null) {

        String[] t = linha.split(";");
        if (numero.equals(t[3]) && cargo.getNome().equals(t[4])) {
          c.setId(Integer.parseInt(t[0]));
          c.setNome(t[1]);
          c.setPartido(t[2]);
          c.setNumeroCandidato(Integer.parseInt(t[3]));
          c.setCargo(Cargo.consultar(t[4]));
          c.setEndFotoCandidato(t[5]);
          c.setNomeVicePriSuplente(t[6]);
          c.setEndFotoVicePriSuplente(t[7]);
          c.setNomeSegSuplente(t[8]);
          c.setEndFotoSegSuplente(t[9]);
        }
      }
      reader.close();
      
    } catch (IOException e) {
      e.printStackTrace();
    }

    return c;
  }

  public static void editar(Candidato candidatoOld, Candidato candidatoNew) {

    String linha;

    String candidatoString = candidatoOld.getId() + ";"
            + candidatoNew.getNome() + ";"
            + candidatoNew.getPartido() + ";"
            + candidatoNew.getNumeroCandidato() + ";"
            + candidatoNew.getCargo().getNome() + ";"
            + candidatoNew.getEndFotoCandidato() + ";"
            + candidatoNew.getNomeVicePriSuplente() + ";"
            + candidatoNew.getEndFotoVicePriSuplente() + ";"
            + candidatoNew.getNomeSegSuplente() + ";"
            + candidatoNew.getEndFotoSegSuplente();

    try {

      BufferedWriter writer = new BufferedWriter(new FileWriter(NOME_ARQUIVO_TEMP));
      BufferedReader reader = new BufferedReader(new FileReader(NOME_ARQUIVO));

      while ((linha = reader.readLine()) != null) {

        String[] t = linha.split(";");

        if (candidatoOld.getId() == Integer.parseInt(t[0])) {
          linha = linha.replace(linha, candidatoString);
        }

        writer.write(linha + "\r\n");
      }
      writer.close();
      reader.close();

    } catch (IOException e) {
      e.printStackTrace();
    }

    while (new File(NOME_ARQUIVO).exists()) {
      new File(NOME_ARQUIVO).delete();
    }
    new File(NOME_ARQUIVO_TEMP).renameTo(new File(NOME_ARQUIVO));
  }

  public static boolean existCandidato(String numero, Cargo cargo) {
    String linha;
    try {
      BufferedReader reader = new BufferedReader(new FileReader(NOME_ARQUIVO));

      while ((linha = reader.readLine()) != null) {

        String[] t = linha.split(";");
        if (numero.equals(t[3]) && cargo.getNome().equals(t[4])) {
          return true;
        }
      }
      reader.close();
      
    } catch (IOException e) {
      e.printStackTrace();
    }
    return false;
  }
  
  /*
   Funcao para saber se existem candidatos cadastrados, ao selecinar o perfil eleitor.
   */
  public static boolean isEmpty() {
    if (new File(NOME_ARQUIVO).length() == 0) {
      return true;
    } else {
      return false;
    }
  }
  
  private static void setEspaceViceSuplente(Candidato cand) {
    cand.setNomeVicePriSuplente(" ");
    cand.setNomeSegSuplente(" ");
    cand.setEndFotoVicePriSuplente(" ");
    cand.setEndFotoSegSuplente(" ");
  }
  
  private static void setEspaceSegSuplente(Candidato cand) {
    cand.setNomeSegSuplente(" ");
    cand.setEndFotoSegSuplente(" ");
  }
  
  public static ArrayList<Candidato> getAllCandidatos(Cargo cargo) {    
    ArrayList<Candidato> lista = new ArrayList<>();

    String linha;
    try {
      BufferedReader reader = new BufferedReader(new FileReader(NOME_ARQUIVO));

      while ((linha = reader.readLine()) != null) {
        Candidato c = new Candidato();
        String[] t = linha.split(";");    
        if (cargo.getNome().equals(t[4])) {
          c.setId(Integer.parseInt(t[0]));
          c.setNome(t[1]);
          c.setPartido(t[2]);
          c.setNumeroCandidato(Integer.parseInt(t[3]));
          c.setCargo(Cargo.consultar(t[4]));
          c.setEndFotoCandidato(t[5]);
          c.setNomeVicePriSuplente(t[6]);
          c.setEndFotoVicePriSuplente(t[7]);
          c.setNomeSegSuplente(t[8]);
          c.setEndFotoSegSuplente(t[9]);  
          
          lista.add(c);
        }
      }
      reader.close();
      
    } catch (IOException e) {
      e.printStackTrace();
    }

    return lista;
  }  

  @Override
  public int compare(Candidato o1, Candidato o2) {
    if (o1 == null || o2 == null) {
      return 0;
    }
    return o2.getQtdeVotos() - o1.getQtdeVotos();
  }
  
}
